2 REM    ****************************************************************
3 REM    **                                                            **
4 REM    **    THE PURPOSE OF THIS PROGRAM IS TO ALLOW THE CREATION    **
5 REM    **    OF GRAPHICS DRAWINGS BY MOVING A DOT CURSOR ON THE      **
6 REM    **    MEDIUM RESOLUTION GRAPHICS SCREEN AND USING THE         **
7 REM    **    DEFINED FUNCTION KEYS TO DRAW LINES, CIRCLES AND TO     **
8 REM    **    PAINT WITHIN DEFINED BOUNDARIES.  THE OPTION TO STORE   **
9 REM    **    THE CREATED SCREENS IS PROVIDED WITH RETRIEVAL FOR      **
10 REM   **    FURTHER EDITING AND STORAGE AVAILABLE.                  **
11 REM   **                                                            **
12 REM   **    AUTHOR: DOUGLAS E. OLUFSEN                              **
13 REM   **    LAST REVISION: DECEMBER 3, 1981                         **
14 REM   **                                                            **
15 REM   ****************************************************************
40 CLS
47 REM ------------------------------------------------------------------------
48 REM  *** DEACTIVATE ALL FUNCTION KEYS  ***
49 KEY OFF
50 KEY 1,"":KEY 2,"":KEY 3,"":KEY 4,"":KEY 5,""
51 KEY 6,"":KEY 7,"":KEY 8,"":KEY 9,"":KEY 10,""
55 DIM POS1(2),POS2(2),POS3(2),POS4(2),POSD(2),BKGND%(93)
56 DIM DTASAVE%(8002)
58 REM ------------------------------------------------------------------------
59 REM  *** CHECK IF PREVIOUSLY STORED SCREEN IS DESIRED ***
60 A$="TESTSCRN"
61 IF "N"=LEFT$(A$,1) OR "n"=LEFT$(A$,1) THEN GOTO 100
62 'PRINT "":INPUT;"ENTER FILE NAME (OR `NONE'): ",A$
63 'IF A$="NONE" OR A$="none" THEN 100
64 ON ERROR GOTO 85:OPEN "R",#1,"SCREENS",128
65 FIELD 1,12 AS NA$,4 AS BKC$,4 AS PAL$,108 AS B$
66 FOR I%=1 TO 9:GET #1,I%
67 IF NA$=LEFT$(A$+SPACE$(12),12) THEN GOTO 70 ELSE NEXT I%
68 PRINT " ":PRINT "FILE SELECTED NOT ON DATA DISK":CLOSE 1:GOTO 62
70 BKC=CVS(BKC$):PAL=CVS(PAL$)
71 CLOSE 1
78 ON ERROR GOTO 0
79 'GOSUB 9100
80 GOSUB 9500
81 SCREEN 1
82 COLOR BKC,PAL
83 DEF SEG =&HB800:BLOAD A$,0:DEF SEG
84 GOTO 200
85 IF ERR=53 AND ERL=66 THEN PRINT "INDEX FILE NOT FOUND - TRY AGAIN.":RESUME 6
86 IF ERR=5 AND ERL=2205 THEN RESUME 2210 ELSE GOTO 9900
98 REM ------------------------------------------------------------------------
99 REM  *** INPUT OF THE BACKGROUND AND PALETTE COLORS FOR NEW SCREEN ***
100 PRINT "":INPUT;"BACKGROUND COLOR NUMBER (0-15;16 FOR LIST): ",BKC
110 IF BKC>=0 AND BKC<=15 THEN 130 ELSE IF BKC=16 THEN 120 ELSE PRINT "  >>> INPUT ERROR <<<":GOTO 100
120 PRINT " "
121 PRINT "COLOR KEY:"
122 PRINT "     0  BLACK           8  GRAY"
123 PRINT "     1  BLUE            9  LIGHT BLUE"
124 PRINT "     2  GREEN          10  LIGHT GREEN"
125 PRINT "     3  CYAN           11  LIGHT CYAN"
126 PRINT "     4  RED            12  LIGHT RED"
127 PRINT "     5  MAGENTA        13  LIGHT MAGENTA"
128 PRINT "     6  BROWN          14  YELLOW"
129 PRINT "     7  WHITE          15  HIGH INTENSITY WHITE":PRINT " ":GOTO 100
130 PRINT " "
131 INPUT "PALETTE GROUP NUMBER (0 OR 1): ",PAL
132 IF PAL=0 OR PAL=1 THEN 154 ELSE PRINT "  >>>INPUT ERROR<<<":GOTO 131
154 GOSUB 9100
155 GOSUB 9500
163 SCREEN 1
164 COLOR BKC,PAL
199 REM ----------------------------------------------------------------------
200 REM ***DEFINE SUBROUTINE LOCATIONS FOR FUNCTION AND CURSOR KEYS***
210 ON KEY (1) GOSUB 1100:ON KEY (2) GOSUB 1200:ON KEY (3) GOSUB 1300
220 ON KEY (4) GOSUB 1400:ON KEY (5) GOSUB 1500:ON KEY (6) GOSUB 1600
230 ON KEY (7) GOSUB 1700:ON KEY (8) GOSUB 1800:ON KEY (9) GOSUB 1900
240 ON KEY(10) GOSUB 2000:ON KEY(11) GOSUB 2100:ON KEY(12) GOSUB 2200
250 ON KEY(13) GOSUB 2300:ON KEY(14) GOSUB 2400:ON PEN GOSUB 2500
259 REM ----------------------------------------------------------------------
260 REM ***ACTIVATE FUNCTION AND CURSOR KEYS AS REQUIRED***
270 KEY (1) ON: KEY (2) OFF: KEY (3) ON: KEY (4) ON: KEY (5) ON
280 KEY (6) ON: KEY (7) OFF: KEY (8) OFF: KEY (9) OFF: KEY(10) OFF
290 KEY(11) ON: KEY(12) ON: KEY(13) ON: KEY(14) ON:PEN ON
299 REM ----------------------------------------------------------------------
300 REM ***INITIALIZE NECESSARY VARIABLES***
310 LASTC=0
320 OPT=0
321 OUT1=0
322 ON ERROR GOTO 86
399 REM ----------------------------------------------------------------------
400 REM ***PLACE CURSOR DOT ON SCREEN AND LOOP UNTIL INTERRUPTED***
410 PSET (POSD(1),POSD(2)),3
420 FOR IX=1 TO 40
421 AA=1+1
422 NEXT
430 PRESET (POSD(1),POSD(2))
440 FOR IX=1 TO 40
441 AA=1+1
442 NEXT
449 IF OUT1=1 THEN PSET(POSD(1),POSD(2)),LASTC:GOSUB 9900
450 GOTO 400
1099 REM ----------------------------------------------------------------------
1100 REM *** KEY F1 ACTIVATED *** START LINE/CIRCLE POINT (POS1) ***
1101 POS1(1)=POSD(1):POS1(2)=POSD(2)
1105 IF OPT=0 THEN OPT=1:GOTO 1110 ELSE IF OPT=2 THEN GOTO 1130 ELSE GOTO 1198
1110 KEY (1) OFF:KEY (3) OFF:KEY (5) OFF:KEY (6) OFF
1120 KEY (2) ON
1130 KEY (1) OFF:KEY (3) OFF:KEY (5) OFF:KEY (6) OFF
1135 KEY (7) ON:KEY (8) ON:KEY (9) ON:KEY (10) ON
1198 RETURN
1199 REM ----------------------------------------------------------------------
1200 REM *** KEY F2 ACTIVATED *** END LINE/CIRCLE POINT (POS2) ***
1205 POS2(1)=POSD(1):POS2(2)=POSD(2)
1210 KEY (2) OFF
1220 KEY (7) ON:KEY (8) ON:KEY (9) ON:KEY (10) ON
1240 RETURN
1299 REM ----------------------------------------------------------------------
1300 REM *** KEY F3 ACTIVATED *** CIRCLE INITIATED - CENTER POINT (POS3) ***
1301 POS3(1)=POSD(1):POS3(2)=POSD(2)
1305 IF OPT=0 THEN OPT=2
1306 IF OPT=3 THEN 1350
1310 KEY (3) OFF:KEY (5) OFF:KEY (6) OFF
1315 GOTO 1398
1350 KEY (3) OFF
1355 KEY (7) ON:KEY (8) ON:KEY (9) ON: KEY (10) ON
1398 RETURN
1399 REM ----------------------------------------------------------------------
1400 REM *** KEY F4 ACTIVATED *** ABORT CURRENT DRAWING ***
1401 REM ***REINITIALIZE FUNCTION AND CURSOR KEYS ACTIVATION***
1410 KEY (1) ON: KEY (2) OFF: KEY (3) ON: KEY (4) ON: KEY (5) ON
1420 KEY (6) ON: KEY (7) OFF: KEY (8) OFF: KEY (9) OFF: KEY(10) OFF
1430 KEY(11) ON: KEY(12) ON: KEY(13) ON: KEY(14) ON
1440 OPT=0
1450 POS1(1)=0:POS1(2)=0:POS2(1)=0:POS2(2)=0:POS3(1)=0:POS3(2)=0
1498 RETURN
1499 REM ----------------------------------------------------------------------
1500 REM *** KEY F5 ACTIVATED *** INITIATE PAINT FUNCTION ***
1505 KEY (1) OFF:KEY (3) OFF:KEY (6) OFF
1510 KEY (7) ON:KEY (8) ON:KEY (9) ON: KEY (10) ON
1511 IF OPT=3 THEN GET(0,0)-(103,6),BKGND%:GOTO 1512 ELSE GOTO 1530
1512 KEY (5) OFF:KEY (7) OFF:KEY (8) OFF:KEY (9) OFF:KEY (10) OFF
1513 LOCATE 1,1:INPUT;"BACKGROUND:",BKC
1514 PUT (0,0),BKGND%,PSET
1515 IF BKC>=0 AND BKC<=15 THEN GOTO 1516 ELSE GOTO 1513
1516 LOCATE 1,1:INPUT;"PALETTE:",PAL
1517 PUT (0,0),BKGND%,PSET
1518 IF PAL>=0 AND PAL<=1 THEN GOTO 1519 ELSE GOTO 1516
1519 IF COLR1>=0 AND COLR1<=15 THEN COLOR BKC,PAL ELSE GOTO 1598
1524 GOSUB 1400
1525 GOTO 1598
1530 OPT=3
1531 POS1(1)=POSD(1):POS1(2)=POSD(2)
1598 RETURN
1599 REM ----------------------------------------------------------------------
1600 REM *** KEY F6 ACTIVATED *** END DRAWING AND STORE SCREEN ***
1601 PSET (POSD(1),POSD(2)),LASTC
1605 GOTO 9900
1698 OUT1=1:RETURN 449
1699 REM ----------------------------------------------------------------------
1700 REM *** KEY F7 ACTIVATED *** SELECT COLOR 0 (BACKGROUND) ***
1705 IF OPT=4 THEN COLR2=0:GOSUB 3000 ELSE COLR1=0:GOSUB 3000
1798 RETURN
1799 REM ----------------------------------------------------------------------
1800 REM *** KEY F8 ACTIVATED *** SELECT COLOR 1 (PALETTE) ***
1805 IF OPT=4 THEN COLR2=1:GOSUB 3000 ELSE COLR1=1:GOSUB 3000
1898 RETURN
1899 REM ----------------------------------------------------------------------
1900 REM *** KEY F9 ACTIVATED *** SELECT COLOR 2 (PALETTE) ***
1905 IF OPT=4 THEN COLR2=2:GOSUB 3000 ELSE COLR1=2:GOSUB 3000
1998 RETURN
1999 REM ----------------------------------------------------------------------
2000 REM *** KEY F10 ACTIVATED *** SELECT COLOR 3 (PALETTE) ***
2005 IF OPT=4 THEN COLR2=3:GOSUB 3000 ELSE COLR1=3:GOSUB 3000
2098 RETURN
2099 REM ----------------------------------------------------------------------
2100 REM *** CURSOR MOVEMENT UP DETECTED ***
2105 PSET (POSD(1),POSD(2)),3
2110 IF POSD(2)=0 THEN BEEP:GOTO 2198
2115 PRESET (POSD(1),POSD(2)),LASTC
2120 POSD(2)=POSD(2)-1
2125 LASTC=POINT(POSD(1),POSD(2))
2198 RETURN
2199 REM ----------------------------------------------------------------------
2200 REM *** CURSOR MOVEMENT LEFT DETECTED ***
2205 PSET (POSD(1),POSD(2)),3
2210 IF POSD(1)=0 THEN BEEP:GOTO 2298
2215 PRESET (POSD(1),POSD(2)),LASTC
2220 POSD(1)=POSD(1)-1
2225 LASTC=POINT(POSD(1),POSD(2))
2298 RETURN
2299 REM ----------------------------------------------------------------------
2300 REM *** CURSOR MOVEMENT RIGHT DETECTED ***
2305 PSET (POSD(1),POSD(2)),3
2310 IF POSD(1)=319 THEN BEEP:GOTO 2398
2315 PRESET (POSD(1),POSD(2)),LASTC
2320 POSD(1)=POSD(1)+1
2325 LASTC=POINT(POSD(1),POSD(2))
2398 RETURN
2399 REM ----------------------------------------------------------------------
2400 REM *** CURSOR MOVEMENT DOWN DETECTED ***
2405 PSET (POSD(1),POSD(2)),3
2410 IF POSD(2)=199 THEN BEEP:GOTO 2498
2415 PRESET (POSD(1),POSD(2)),LASTC
2420 POSD(2)=POSD(2)+1
2425 LASTC=POINT(POSD(1),POSD(2))
2498 RETURN
2499 REM ----------------------------------------------------------------------
2500 REM *** CURSOR MOVEMENT FROM LIGHT PEN DETECTED ***
2505 PSET (POSD(1),POSD(2)),3
2510 IF PEN(1)<0 OR PEN(1)>319 THEN BEEP:GOTO 2598
2512 IF PEN(2)<0 OR PEN(2)>199 THEN BEEP:GOTO 2598
2515 PRESET (POSD(1),POSD(2)),LASTC
2520 POSD(1)=PEN(1):POSD(2)=PEN(2)
2525 LASTC=POINT(POSD(1),POSD(2))
2598 RETURN
2599 REM ----------------------------------------------------------------------
3000 REM *** DRAW DESIRED FEATURE ***
3005 IF OPT=1 THEN 3010 ELSE IF OPT=2 THEN 3020
3006 IF OPT=3 THEN 3030 ELSE IF OPT=4 THEN 3040 ELSE 3090
3010 LINE (POS1(1),POS1(2))-(POS2(1),POS2(2)),COLR1:GOTO 3090
3020 RAD=(((POS3(1)-POS1(1))^2)+((POS3(2)-POS1(2))^2))^.5
3021 STRRAD=0:ENDRAD=2*3.141593
3025 CIRCLE(POS3(1),POS3(2)),RAD,COLR1,STRRAD,ENDRAD
3026 LASTC=POINT(POSD(1),POSD(2)):GOTO 3090
3030 OPT=4:GOTO 3099
3040 PSET(POS1(1),POS1(2)),LASTC
3041 PAINT (POS1(1),POS1(2)),COLR1,COLR2:LASTC=COLR1:GOTO 3090
3090 GOSUB 1400
3099 RETURN
9099 REM ----------------------------------------------------------------------
9100 REM *** SUBROUTINE TO LIST ON SCREEN FUNCTION KEY DEFINITIONS ***
9110 CLS
9111 PRINT"FUNCTION KEY DEFINITIONS:
9112 PRINT"  KEY  1: Start LINE Function/CIRCLE Radius Point Defined
9113 PRINT"  KEY  2: End LINE Point Defined
9114 PRINT"  KEY  3: Start CIRCLE Function - Center Point Defined
9115 PRINT"  KEY  4: ABORT Function - RESET To Start New Function
9116 PRINT"  KEY  5: Start PAINT Function
9117 PRINT"  KEY  6: END SCREEN SESSION - Option To Store
9118 PRINT"  KEY  7: COLOR 0 Selection (Background) - Complete Function
9119 PRINT"  KEY  8: COLOR 1 Selection (Palette 1)  - Complete Function
9120 PRINT"  KEY  9: COLOR 2 Selection (Palette 2)  - Complete Function
9121 PRINT"  KEY 10: COLOR 3 Selection (Palette 3)  - Complete Function
9122 PRINT" "
9123 PRINT"TYPICAL FUNCTIONS AND FUNCTION KEY ORDER OF EXECUTION
9124 PRINT"   DRAW A LINE:   K1, K2, K7 or K8 or K9 or K10
9125 PRINT" "
9126 PRINT"   DRAW A CIRCLE:  K3, K1, K7 or K8 or K9 or K10
9127 PRINT" "
9128 PRINT"   PAINT WITHIN A BOUNDARY:  K5, K7-K10 (COLOR), K7-K10 (BOUNDARY)
9129 PRINT" "
9130 PRINT"   BACKGROUND/PALETTE SELECTION:  K5, K5, VALUE (0-15), VALUE (0-1)
9131 PRINT" "
9132 PRINT"   DOT CURSOR MOVEMENT WITH CURSOR KEYS ( "+CHR$(27)+" "+CHR$(24)+" "+CHR$(26)+" "+CHR$(25)+" )
9133 RETURN
9299 REM ----------------------------------------------------------------------
9300 REM  *** SUBROUTINE TO STORE SCREEN DATA ON DISKETTE  ***
9301 REM  *** DATA VARIABLES FOR STORAGE:                  ***
9302 REM  ***     `BKC' = BACKGROUND COLOR                 ***
9303 REM  ***     `PAL' = PALETTE CHOSEN                   ***
9309 NA$="NONE"
9310 IF NA$="NONE" OR NA$="none" THEN GOTO 9900
9311 ON ERROR GOTO 0
9320 OPEN "R",#1,"SCREENS",128:IR%=0
9321 FIELD 1,12 AS A$,4 AS BKC$,4 AS PAL$,108 AS B$
9322 FOR I%=1 TO 9:GET #1,I%
9323 IF A$=LEFT$(NA$+SPACE$(12),12) THEN IR%=I%:GOTO 9330 ELSE IF A$=STRING$(12,CHR$(0)) AND IR%=0 THEN IR%=I%
9324 NEXT I%
9325 IF IR%=0 THEN PRINT "DISK IS FULL - REPLACE WITH ANOTHER DISK OR FILENAME":CLOSE 1:GOTO 9300
9326 LSET A$=LEFT$(NA$+SPACE$(12),12):LSET BKC$=MKS$(BKC):LSET PAL$=MKS$(PAL)
9327 PUT #1,IR%:CLOSE 1:GOTO 9340
9330 PRINT " ":INPUT;"FILE ALREADY EXISTS - OVERLAY (Y/N)";B$
9331 IF B$="Y" OR B$="y" THEN GOTO 9326 ELSE CLOSE 1:GOTO 9300
9340 GOSUB 9500:SCREEN 1:COLOR BKC,PAL:PUT (0,0),DTASAVE%
9350 DEF SEG=&HB800:BSAVE NA$,0,&H4000:DEF SEG
9355 GOSUB 9600
9360 PRINT " ":PRINT "FILE ("+NA$+") HAS BEEN STORED."
9370 RETURN
9499 REM ----------------------------------------------------------------------
9500 REM  *** SWITCH TO COLOR/GRAPHICS ADAPTER ***
9501 DEF SEG=0
9502 POKE &H410,(PEEK(&H410) AND &HCF) OR &H20
9503 DEF SEG
9504 LOCATE ,,1,6,7
9505 SCREEN 0
9506 WIDTH 40
9507 KEY OFF
9508 RETURN
9599 REM ----------------------------------------------------------------------
9600 REM  *** SWITCH TO MONOCHROME ADAPTER ***
9601 DEF SEG=0
9602 POKE &H410,(PEEK(&H410) OR &H30)
9603 DEF SEG
9604 LOCATE ,,1,12,13
9605 SCREEN 0
9606 WIDTH 80
9607 RETURN
9799 REM ----------------------------------------------------------------------
9800 REM *** SUBROUTINE TO RE-ESTABLISH ORIGINAL FUNCTIONAL KEY DEFINITIONS ***
9810 'KEY ON
9811 KEY 1,"LIST "
9812 KEY 2,"RUN"+CHR$(13)
9813 KEY 3,"LOAD"+CHR$(34)
9814 KEY 4,"SAVE"+CHR$(34)
9815 KEY 5,"CONT"+CHR$(13)
9816 KEY 6,","+CHR$(34)+"LPT1:"+CHR$(34)+CHR$(13)
9817 KEY 7,"TRON"+CHR$(13)
9818 KEY 8,"TROFF"+CHR$(13)
9819 KEY 9,"KEY "
9820 KEY 10,"SCREEN 0,0,0"+CHR$(13)
9821 RETURN
9899 REM ----------------------------------------------------------------------
9900 GOSUB 9800:CHAIN "A:HAPPYB"
9901 PRINT  "    USE FUNCTION `GRAPHICS' TO RETRIEVE AND EDIT AND SAVE SCREEN."
9903 KEY ON
9904 GOSUB 9800
9905 END
